package com.wn.product.work1;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author yellow Docter
 * @date 2022 -11-02
 * @desc  测试消息可靠性
 *
 *  1、发送消息 setConfirmCallback  确保消息到 交换机中
 *  2、发送消息 setReturnCallback   确保消息从 交互通过路由到 队列中(错误的时候 才会执行 下面的回调 )
 */
@Component
@Slf4j
public class Work05Product {


    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 发送消息的方法
     * @param msg
     */
    public void sendMsg(String exchangeName,String key,String msg){

//        //消息发送到交换机的 监听 (回调)
//        rabbitTemplate.setConfirmCallback((correlationData, ack, cause)->{
//            // correlationData 消息数据
//            // ack   true成功
//            // cause 失败的原因
//
//            log.info("correlationData 数据:{}",correlationData);
//
//            if (ack){
//                log.info("消息发送到了  交换机中.....");
//            }else{
//                log.info("消息发送到了失败===>{}",cause);
//            }
//        });

        //发送消息到 队列中进行回调操作
        rabbitTemplate.setMandatory(true);

//        //错误的时候 才会执行 下面的回调
//        rabbitTemplate.setReturnCallback(( message,  replyCode,  replyText,  exchange,  routingKey)->{
//            log.info("message==>{}",message);
//            log.info("replyCode==>{}",replyCode);
//            log.info("replyText==>{}",replyText);
//            log.info("exchange==>{}",exchange);
//            log.info("routingKey==>{}",routingKey);
//
//            System.out.println("失败的消息：message"+ message);
//            //再次发送
//            //存储到数据中
//            // 异常监控系统 (发送 message)
//
//        });

        /**
         * 发送消息的方法：
         * 1、交换机   不给 使用默认的交换机
         * 2、路由key  (队列)
         * 3、发送的消息 (object 都是消息 )
         */
        rabbitTemplate.convertAndSend(exchangeName,key,msg);
        log.info("消息发送成功:===>{},路由是:{}",msg,key);

    }

}
